As technology advances, data storage is increasingly important and data storage capacities are increasing rapidly. Correspondingly, the size of data storage arrays and their demands for storage have increased rapidly. Ever increasing amounts of data are required to be highly available and protected from corruption or damage that may be caused by any of a variety of factors, such as natural disasters and power failures, etc. As a result, increasingly complex data storage clusters are used to satisfy the demands for data storage and retrieval.
Similarly, virtualization of computers and/or operating systems has become increasingly important to enable server consolidation such that many small physical servers can be replaced by one larger physical server. This results in increased and more efficient utilization of costly hardware resources such as central processing units (CPU), thereby allowing power savings and hardware cost savings.
Virtual environments typically include virtualized computers and/or operating systems known as virtual machines which require access to storage. Access to storage is provided by virtual input/output (I/O) servers which virtualize the physical storage. Applications running on the virtual machines use the storage provided by the virtual IO servers to hand requests and perform various functions.
In response to an application error or failure, application data can get corrupt during an application restart or recovery in a variety of situations. If I/O requests initiated by an application that has failed are not drained or completed before a new application instance starts issuing IO requests, data corruption may occur. In particular, virtual environments make such a situation more difficult to deal with as the virtual IO server adds an additional layer of virtualization to the storage, thereby removing the possibility of identifying and filtering out IO requests from the virtual machine running the application that has died or hung.
Thus, a need exists to handle incomplete IO requests in virtual environments prior to restarting or recovering an application.